from datetime import time
from typing import Tuple, Optional
import struct

class BatteryDataParser:
    def __init__(self):
        self.battery_percentage = None
        self.battery_voltage_mv = None
        self.save_battery_flag = False

    def parse_battery_data(self, data: bytes) -> Tuple[Optional[int], Optional[int]]:
        """
        解析电池数据
        返回: (电池百分比%, 电池电压mv)
        """
        if not data:
            print("❌ 电池数据为空")
            return None, None

        data_len = len(data)
        print(f"🔋 收到电池数据: 长度={data_len}, 原始数据={data.hex()}")

        try:
            if data_len == 1:
                # 只有电池百分比
                battery_percentage = data[0]
                self.battery_percentage = battery_percentage
                self._log_battery_percentage(battery_percentage)
                return battery_percentage, None

            elif data_len == 4:
                # 包含电池百分比和电压
                # 根据Android代码，第一个字节是百分比，后面3个字节是电压
                battery_percentage = data[0]
                battery_voltage = self._bytes_to_uint32(data)

                self.battery_percentage = battery_percentage
                self.battery_voltage_mv = battery_voltage

                self._log_battery_percentage(battery_percentage)
                self._log_battery_voltage(battery_voltage)

                return battery_percentage, battery_voltage

            else:
                print(f"⚠️ 未知的电池数据格式，长度: {data_len}")
                return None, None

        except Exception as e:
            print(f"❌ 解析电池数据错误: {e}")
            return None, None

    def _bytes_to_uint32(self, data: bytes) -> int:
        """将4字节数据转换为32位无符号整数"""
        # Android代码中是读取4个字节，但第一个字节是百分比
        # 所以电压应该是后3个字节 + 可能的第一个字节的部分信息
        # 这里根据实际数据格式调整
        if len(data) == 4:
            # 方法1: 使用struct解析
            try:
                # 假设数据格式为: [百分比, 电压低字节, 电压中字节, 电压高字节]
                voltage = struct.unpack('<I', data[1:4] + b'\x00')[0]
                return voltage
            except:
                # 方法2: 直接计算
                voltage = (data[1] << 16) | (data[2] << 8) | data[3]
                return voltage
        return 0

    def _one_byte_to_uint32(self, data: bytes) -> int:
        """单字节转32位整数（实际就是字节值）"""
        return data[0] if data else 0

    def _log_battery_percentage(self, percentage: int):
        """记录电池百分比"""
        message = f"电池电量（百分比%）: {percentage}%"
        print(f"🔋 {message}")

        if self.save_battery_flag:
            self._save_battery_file(str(percentage))

    def _log_battery_voltage(self, voltage_mv: int):
        """记录电池电压"""
        message = f"电池电量（电压mv）: {voltage_mv}mV"
        print(f"⚡ {message}")

        # 可选：将电压转换为更易读的格式
        voltage_v = voltage_mv / 1000.0
        print(f"⚡ 电池电压: {voltage_v:.2f}V")

    def _save_battery_file(self, data: str):
        """保存电池数据到文件（模拟Android的保存功能）"""
        try:
            timestamp = time.strftime("%Y-%m-%d %H:%M:%S")
            with open("battery_log.txt", "a", encoding="utf-8") as f:
                f.write(f"[{timestamp}] {data}\n")
        except Exception as e:
            print(f"❌ 保存电池数据失败: {e}")

    def set_save_battery_flag(self, save: bool):
        """设置是否保存电池数据标志"""
        self.save_battery_flag = save
        status = "启用" if save else "禁用"
        print(f"📝 电池数据保存: {status}")